GradleXcodeプロジェクトをビルド/テスト


概要

Gradleのプラグインで、XcodeのiOSビルドとかを補助するものがあった。

https://github.com/openbakery/gradle-xcodePlugin


その簡単な使い方を見つつ、発展系として

TestFlightに放り込んだり、

先のUnityビルドとの連携を試してみたり、

超願望としてはCocoaPodsと連携させてみたい。


サンプルプロジェクトはgithubにあげておいた。

https://github.com/sassembla/Gradle_XcodeSample


手順と読者想定

iOSでのアプリ作りとかしたことあるような前提で書いてます。


Xcodeで新規プロジェクトを作成、UnitTestとか適当に全部のせ、みたいなところに、

Gradleでの一般的なビルドスタイルとして build.gradle ファイルをプロジェクトフォルダに置いた、という地点からのスタート。



手始めにSimulator用ビルド

プロジェクトフォルダ直下のbuild.gradleを編集。


build.gradle

buildscript {

repositories {

maven {

url('http://openbakery.org/repository/')

//url uri('/tmp/repo')

}

mavenCentral()

    }

    dependencies {

        classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.6.+'

    }

}



apply plugin: 'xcode'


buildscript {

    configurations.classpath.resolutionStrategy.cacheChangingModulesFor 0, 'seconds'

}


xcodebuild {

sdk = 'iphonesimulator'

target = 'Gradle_XcodeSample'

}


特に解説がいらないんじゃないかな的な気もするくらい、簡単なビルドスクリプト。


で、Terminalでgradle xcodebuild とか実行すると、

スクリーンショット 2012-12-31 2.00.33.png

Simulatorでのビルド、成功!。



Simulatorでのtest

前提として、下記を満たしている必要がある。


・テスト対象は、Xcodeで作ったOCTestUnitのコード

・テスト用のbundleがある


みためでいうとこんな感じ。

スクリーンショット 2012-12-31 1.24.39.png

で、OCUnitをコマンドラインから実行するために、TEST HOST のパラメータを空にする。

理由はおまけで後述

スクリーンショット 2012-12-31 1.27.26.png


で、build.gradleの設定を調整する。

xcodebuild タスクの中に1行追加

build.gradle

xcodebuild {

sdk = 'iphonesimulator'

target = 'Gradle_XcodeSample'

unitTestTarget = 'Gradle_XcodeSampleTests'

}

これで、xcodebuild実行時に、unitTestTargetで指定したターゲットに含まれるOCUnitTestが実行される。

試しに実行すると、一件のテストが失敗する。

スクリーンショット 2012-12-31 1.49.31.png

通常のGradleの動作だと、テストが成功したり失敗したりしたリストがxmlファイルとして生成されるのだけれど、

このプラグインにはまだその出力機構は無い模様。


ちなみに自作はかんたんな筈です。


Deviceでのビルド

魅力を感じないのでパス。



Deviceでのテスト

あまり魅力を感じないのでやはりパス

Xcodeつないでるとき以外やんないでしょ。



Testflightとの連携

また今度。



おまけ

なんでSimulatorでTestする際、Test Host 項目を空にするのか

Xcodeをインストールすると使える Xcodebuildコマンドで、OCUnitの実行は出来る。

んだけど、


xcodebuild -configuration Debug -sdk iphonesimulator -target Gradle_XcodeSampleTests TEST_AFTER_BUILD=YES DSTROOT=/Users/sassembla/Desktop/Gradle_XcodeSample/build/dst OBJROOT=/Users/sassembla/Desktop/Gradle_XcodeSample/build/obj SYMROOT=/Users/sassembla/Desktop/Gradle_XcodeSample/build/sym SHARED_PRECOMPS_DIR=/Users/sassembla/Desktop/Gradle_XcodeSample/build/shared


とか実行しようとすると、

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:81: 

warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).


って言われて、テストがスキップされてしまう。

ようは、SimulatorでTestする場合、TEST_HOSTのパラメータに何かセットしてあると、サポートしてないんでスキップするぜ、っていうことだった。

デフォルトで、このパラメータはプロジェクト自体のパスが入っている。


で、上でやったように、このTEST_HOST項目を空にすることでテストがスキップされずにちゃんと実行されるよ、ということ。